package bancosys.tec.security.authorization;

import java.io.Serializable;

/**
 * Permissão de Ação. Uma ação é representada pelo dois parametros: o bean a que ela é associada e a ação propriamente dita nesse bean.
 * 
 * @author piercio
 */
public class ActionPermission extends AbstractPermission implements Serializable {

    private static final long serialVersionUID = 1L;

    private String bean;

    private String act;

    /**
     * Construtor.
     * 
     * @param id a ação. A ação deve ser representada da seguinte forma: bean.action, onde bean é o nome do bean que exeturará a ação e
     * action é o nome da ação. Tanto bean como action podem ser substituidos por *, trantando-o como um wildcard (p.e. praca.*, *.edit, ou
     * *.*).
     */
    public ActionPermission(String id) {
        this.id = id;
        this.type = ActionPermission.class;
        String[] values = id.split("\\.");
        this.bean = values[0];
        if(values.length > 1) {
            this.act = values[1];
        } else {
            this.act = "";
        }
    }

    /**
     * Compara uma acao com o dessa instância.
     * 
     * @param action a ação a ser testada.
     * @return <code>true</code> se id conferir com o parâmetro, <code>false</code> caso contrário.
     */
    @Override
    protected boolean matchPermissionId(String action) {
        String[] values = action.split("\\.");
        if (this.bean.equals("*") || this.bean.equalsIgnoreCase(values[0])) {
            if (this.act.equals("*")) {
                return true;
            } else {
                return values.length < 2 || this.act.equalsIgnoreCase(values[1]);
            }
        }
        return false;
    }

    /**
     * Devolve a representação string dessa entidade.
     * 
     * @return a representação string dessa entidade.
     */
    @Override
    public String toString() {
        return "ActionPermission(action: " + this.id + ")";
    }
}
